package com.study.spark.scala.chapter06

import java.util

import scala.beans.BeanProperty

object Scala04_Object_Field {
  def main(args: Array[String]): Unit = {
    // TODO 面向对象编程 - 类 - 属性
    // 所谓的属性就是类中的变量
    val test = new Test
    // 访问类属性，等同于调用对象属性的get方法
    println(test.name)//zhangsan
    println(test.age)//20

    // 给类属性赋值，等同于调用对象属性的set方法
    test.name="lisi"

    // 使用val声明的类属性取值不可更改
    // 在编译时会添加final关键字，不会提供属性的set方法
    // test.age=22

    // var声明的属性值有对应的set方法修改属性值
    println(test.name)//lisi

    // Scala中变量必须显示初始化
    // 如果希望Scala中变量和java一样由系统自动初始化，而不是手动赋值。就要使用特殊符号：下划线。
    // 但是要求是var声明的变量才能使用 _ 不然运行报错

    // java bean规范：getsetXXX命名规范
    // 反射一般用于架构设计，而架构设计的目的就是通用化
    // scala中给属性提供setget方法不遵循bean规范  为此马丁加入了注解：@BeanProperty
    test.setEmail("123@qq.com")
    println(test.getEmail)
  }
  class Test{
    // 声明属性
    /*
    编译后的class文件中属性变成了私有属性
    但是也提供了类似getset的公共方法
    私有属性：
    private String name = "zhangsan";
    private final int age = 20;
    private String email;

    类似getset的公共方法
    public String name()
    {
      return this.name; }
    public void name_$eq(String x$1) { this.name = x$1; }
    public int age() { return this.age; }
    public String email() { return this.email; }
    public void email_$eq(String x$1) { this.email = x$1; }

    注解：@BeanProperty后直接编译生成了getset方法。这样就遵循了bean规范
    public String getEmail() { return email(); }
    public void setEmail(String x$1) { email_$eq(x$1); }
     */
    var name : String = "zhangsan"
    val age : Int =20
    @BeanProperty var email : String = _
}

}


